package com.itcast.dao;

import com.itcast.domain.Customer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * @Author: Ray
 * @Date: 2020/12/12 00:09
 *
 * spring data jpa dao层规范：
 *      继承jpaRepository<操作的实体类，实体类主键类型>
 *      继承JpaSpecificationExecutor<操作的实体类>
 */

public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
    /**
     * 根据客户名称查询客户
     * jpql: from Customer where custName = ?
     * 配置jpql语句，使用@Query注解
     */
    @Query(value = "from Customer where custName = ?")
    Customer findJpql(String custName);

    /**
     * 根据客户名称和客户id查询客户
     * 可以使用占位符和索引指定占位符取值来源，如：
     * jpql: from Custome where custId = ?2 and custName = ?1
     */
    //@Query(value = "from Customer where custName = ? and custId = ?")
    @Query(value = "from Customer where custId = ?2 and custName = ?1")
    Customer findByNameAndId(String name,Long id);

    /**
     * 根据id修改客户名称
     * @Modifying :当前是一个更新操作
     */

    @Query(value = "update Customer set custName =?2 where custId =?1")
    @Modifying
    void updateCustomer(long id,String name);

    /**
     * 使用sql形式查询
     * nativeQuery:使用sql查询方式，默认false
     */
    //@Query(value = "select * from cst_customer",nativeQuery = true)
    @Query(value = "select * from cst_customer where cust_name like ?",nativeQuery = true)
    List<Customer> findSql(String name);


    /**
     * 方法名称约定查询方式：
     * findBy ：查询
     *          对象中的属性名（大写首字母） ：查询条件
     *      如：findByCustName --根据客户名查询
     */
    Customer findByCustName(String name);


    /**
     * 模糊查询 findBy +属性名称 +查询方式（like |is null）
     * @param name
     * @return
     */
    List<Customer> findByCustNameLike(String name);

    /**
     * 多条件查询 findBy +属性名称 +查询方式（like |is null） +多条件连接符（and |or） +属性名 +查询方式
     *
     */
    List<Customer> findByCustNameLikeAndCustLevel(String name,String level);
}
